Nacos Client访问鉴权

MSE中的Nacos注册配置中心可以开启鉴权功能,以降低某个实例被恶意用户非法获取或修改的风险。本文介绍如何在MSE上为Nacos实例配置鉴权访问以及如何使用Nacos Client进行鉴权访问。

前提条件

访问方式

本文使用引擎直连链路的方式配置鉴权访问。授权成功后,Nacos Client可以通过RAM用户或RAM角色访问MSE的Nacos。

  • 引擎直连链路:通过SDK/Client直接访问Nacos引擎,主要用于程序应用对Nacos引擎的访问。

  • 引擎管控链路:通过管控控制台对Nacos引擎进行操作、查看和运维,适用于各类人员使用Nacos引擎。关于引擎管控链路的访问鉴权配置和使用,即为RAM用户授予使用MSE控制台权限的具体操作,请参见注册配置中心授权

image

开启鉴权

重要
  • 创建的Nacos引擎默认不启用鉴权,Nacos引擎会响应所有请求。

  • Nacos开源控制台的登录功能仅用于记录用户,并没有鉴权拦截请求的能力,您可以参照本文开启鉴权。开启Nacos鉴权功能之后,无法通过Nacos开源控制台访问Nacos实例,仅支持使用MSE控制台访问该实例。

  1. 登录MSE注册配置中心管理控制台,并在顶部菜单栏选择地域。

  2. 在左侧导航栏,选择注册配置中心 > 实例列表

  3. 实例列表页面,单击目标实例名称。

  4. 在左侧菜单栏,单击参数设置,然后在参数设置页面单击编辑

  5. 选择ConfigAuthEnabledNamingAuthEnabled参数,在列,单击ConfigAuthEnabledNamingAuthEnabled对应的,然后单击保存并重启实例

    重要
    • 打开配置中心鉴权或注册中心鉴权开关前,您需要在客户端配置访问凭证,否则将无法获取配置或服务,如何配置访问凭证请参见客户端配置访问凭证

    • 两个开关分别控制对应模块,互不影响。

    参数

    说明

    ConfigAuthEnabled

    配置中心鉴权开关。支持基础版1.2.1及以上版本的实例,以及专业版及开发版全版本的实例。

    NamingAuthEnabled

    注册中心鉴权开关。支持专业版或开发版2.0.4及以上版本的实例。

客户端配置访问凭证

MSE Nacos支持多种方式初始化凭证提供者,您可以根据使用场景对认证和授权的要求,选择对应的方式初始化凭证提供者。

凭证提供者初始化方式

适用场景

是否需要提供前置的AK或STS Token

底层实现基于的凭证

凭证有效期

凭证轮转或刷新方式

方式一:使用AccessKey

部署运行在安全、稳定且不易受外部攻击的环境的应用程序,无需频繁轮转凭证就可以长期访问云服务。

AK

长期

手动轮转

方式二:使用自动轮转的AccessKey

部署运行在面临AK泄露风险的环境的应用程序,需要频繁轮转凭证才长期能访问云服务。

AK

长期

自动轮转

方式三:使用STS Token

部署运行在不可信的环境的应用程序,希望能控制访问的有效期、权限。

STS Token

临时

手动刷新

方式四:使用RAMRoleARN

需要授权访问云服务,例如跨阿里云账号访问云服务的应用程序。

STS Token

临时

自动刷新

方式五:使用ECSRAMRole

部署运行在阿里云的ECS实例、ECI实例、容器服务Kubernetes版的Worker节点中的应用程序。

STS Token

临时

自动刷新

方式六:使用OIDCRoleARN

部署运行在阿里云的容器服务Kubernetes版的Worker节点中的不可信应用程序。

STS Token

临时

自动刷新

方式七:使用CredentialsURI

需要通过外部系统获取访问凭证的应用程序。

STS Token

临时

自动刷新

方式一:使用AccessKey

步骤一:创建RAM用户(可选)

如果您没有RAM用户或需要创建新的RAM用户,请参见创建RAM用户

步骤二:为RAM用户添加权限

为步骤一所涉及的RAM用户授权,并选择以下系统策略。此操作将为RAM用户授予对所有Nacos实例配置和服务的读写或只读权限,属于粗粒度授权。具体授权操作,请参见为RAM用户授权

权限策略名称

说明

AliyunMSEFullAccess

管理微服务引擎MSE的权限,等同于阿里云账号的权限,被授予该权限的RAM用户拥有所有功能的操作权限。

AliyunMSEReadOnlyAccess

微服务引擎MSE的只读权限,被授予该权限的RAM用户具有阿里云账号所有资源的只读权限。

说明

步骤三:客户端(SDK)配置鉴权

AccessKey包括AccessKey ID和AccessKey Secret,需一起使用。Nacos实例开启鉴权后,在使用Nacos客户端时,需要添加对应RAM用户的AccessKey ID和AccessKey Secret,否则无法访问Nacos实例。关于获取AccessKey,请参见创建AccessKey

Java版本的Nacos Client

若您使用的是Java版本的Nacos Client,请按照下列方式配置程序代码。

说明

使用AccessKey进行鉴权需要客户端升级至对应版本。更多信息,请参见Nacos Client鉴权及加解密支持版本

properties.put(PropertyKeyConst.SERVER_ADDR, "${mseNacos实例域名}");
properties.put(PropertyKeyConst.ACCESS_KEY, "${accessKey}");
properties.put(PropertyKeyConst.SECRET_KEY, "${secretKey}");
NamingService naming = NamingFactory.createNamingService(properties);
ConfigService configService = ConfigFactory.createConfigService(properties);
Spring Cloud Alibaba框架

若您使用的是Spring Cloud Alibaba框架,请在应用配置文件添加下列配置。

说明

需要将Spring Cloud Alibaba框架版本升级至2.2.1.RELEASE及以上版本。

## 注册中心
spring.cloud.nacos.discovery.accessKey=${accessKey}
spring.cloud.nacos.discovery.secretKey=${secretKey}

## 配置中心
spring.cloud.nacos.config.accessKey=${accessKey}
spring.cloud.nacos.config.secretKey=${secretKey}
Dubbo框架

若您使用的是Dubbo框架,请在dubbo配置文件的注册中心链接URL中加入下列配置。

dubbo.registry.address=nacos://${mseNacos实例域名}:8848?accessKey=${accessKey}&secretKey=${secretKey}
Go版本的Nacos Client

若您使用的是Go版本的Nacos Client,请按照下列方式配置程序代码。

说明

使用AccessKey进行鉴权需要客户端升级至对应版本。更多信息,请参见Nacos Client鉴权及加解密支持版本

cc := constant.ClientConfig{
    AccessKey:   "${accessKey}",
    SecretKey:   "${secretKey}"
}

serverConfigs := []constant.ServerConfig{
    {
        IpAddr:      "${mseNacos实例域名}",
        Port:        8848
    }
}

namingClient, err := clients.NewNamingClient(
    vo.NacosClientParam{
        ClientConfig:  &clientConfig,
        ServerConfigs: serverConfigs,
    },
)

configClient, err := clients.NewConfigClient(
    vo.NacosClientParam{
        ClientConfig:  &clientConfig,
        ServerConfigs: serverConfigs,
    },
)
Python版本的Nacos Client

若您使用的是Python版本的Nacos Client,请按照下列方式配置程序代码。

说明

使用AccessKey进行鉴权需要客户端升级至对应版本。更多信息,请参见Nacos Client鉴权及加解密支持版本

client = nacos.NacosClient(${mseNacos实例域名}, ak=${accessKey}, sk=${secretKey})

方式二:使用自动轮转的AccessKey

如果您的应用程序需要长期访问您的MSE Nacos,但部署运行的环境面临AK泄露的风险,需要频繁手动轮转(轮换)AccessKey,您可以使用ClientKey初始化凭证提供者。该方式底层实现是AccessKey。使用ClientKey后,密钥管理服务(KMS)可以对托管的RAM用户AccessKey进行全自动的定期轮转,将静态的RAM用户AK动态化,从而降低AK泄漏的风险。除定期轮转外,KMS还支持立即轮转,在AK泄漏情况下快速更换AK。该方式无需您手动维护一个AK,从而降低安全性风险和维护复杂度增加的风险。如何获取ClientKey,请参见创建应用接入点

步骤一:将RAM用户托管至KMS的RAM凭据管理中

您需要先将已有的RAM用户托管至KMS实例的RAM凭据管理,如何启用KMS的RAM凭据管理,请参见管理及使用RAM凭据

步骤二:为RAM用户添加权限

为步骤一所涉及的RAM用户授权,并选择以下系统策略。此操作将为RAM用户授予对所有Nacos实例配置和服务的读写或只读权限,属于粗粒度授权。具体授权操作,请参见为RAM用户授权

权限策略名称

说明

AliyunMSEFullAccess

管理微服务引擎MSE的权限,等同于阿里云账号的权限,被授予该权限的RAM用户拥有所有功能的操作权限。

AliyunMSEReadOnlyAccess

微服务引擎MSE的只读权限,被授予该权限的RAM用户具有阿里云账号所有资源的只读权限。

说明

步骤三:创建凭据管理配置文件

在项目运行根目录或classpath中创建配置文件,需要注意配置文件名称固定为secretsmanager.properties。文件内容如下:

cache_client_dkms_config_info=[{"regionId":"<your dkms region>","endpoint":"<your dkms endpoint>","passwordFromFilePath":"< your password file path >","clientKeyFile":"<your Client Key file path>","ignoreSslCerts":false,"caFilePath":"<your CA certificate file path>"}]
说明

配置文件中各配置项说明,请参见ClientKey

步骤四:客户端(SDK)配置鉴权

Java版本的Nacos Client

若您使用的是Java版本的Nacos Client,请按照下列方式引入依赖及配置程序代码。

说明

Nacos-Client的版本需要2.1.0及以上版本。更多信息,请参见Nacos Client鉴权及加解密支持版本

<!-- https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client-mse-extension -->
<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-client-mse-extension</artifactId>
    <!-- 需要1.0.5及以上版本 -->
    <version>1.0.5</version>
</dependency>
properties.put(PropertyKeyConst.SERVER_ADDR, "${mseNacos实例域名}");
# 可通过配置环境变量ALIBABA_CLOUD_SECRET_NAME替代
properties.put(ExtensionAuthPropertyKey.SECRET_NAME.getKey(), "${RAM凭据的名称}");
NamingService naming = NamingFactory.createNamingService(properties);
ConfigService configService = ConfigFactory.createConfigService(properties);
Spring Cloud Alibaba框架

若您使用的是Spring Cloud Alibaba框架,请按照下列方式引入依赖并在应用配置文件添加下列配置。

说明
<!-- https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client-mse-extension -->
<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-client-mse-extension</artifactId>
    <!-- 需要1.0.5及以上版本 -->
    <version>1.0.5</version>
</dependency>
## 注册中心
# 可通过配置环境变量ALIBABA_CLOUD_SECRET_NAME替代
spring.cloud.nacos.discovery.alibabaCloudSecretName=${RAM凭据的名称}

## 配置中心
# 可通过配置环境变量ALIBABA_CLOUD_SECRET_NAME替代
spring.cloud.nacos.config.alibabaCloudSecretName=${RAM凭据的名称}
Dubbo框架

若您使用的是Dubbo框架,请按照下列方式引入依赖并在dubbo配置文件的注册中心链接URL中加入下列配置。

说明

Nacos-Client的版本需要2.1.0及以上版本。更多信息,请参见Nacos Client鉴权及加解密支持版本

<!-- https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client-mse-extension -->
<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-client-mse-extension</artifactId>
    <!-- 需要1.0.5及以上版本 -->
    <version>1.0.5</version>
</dependency>
# 可通过配置环境变量ALIBABA_CLOUD_SECRET_NAME替代
dubbo.registry.address=nacos://${mseNacos实例域名}:8848?alibabaCloudSecretName=${RAM凭据的名称}

方式三:使用STS Token

如果您的应用程序需要临时访问MSE Nacos,您可以使用通过STS服务获取的临时身份凭证(Access Key ID、Access Key Secret和Security Token)初始化凭证提供者。

重要

该方式需要您手动维护一个STS Token,存在稳定性风险和维护复杂度增加的风险。此外,如果您需要多次临时访问MSE Nacos,您需要手动刷新STS Token。

步骤一:创建RAM用户和RAM角色(可选)

步骤二:为RAM用户及RAM角色添加权限

  • 为步骤一所涉及的RAM用户授权STS的管理权限,具体请参见AssumeRole - 获取扮演角色的临时身份凭证

  • 为步骤一所涉及的RAM角色授权,并选择以下系统策略。此操作将为RAM角色授予对所有Nacos实例配置和服务的读写或只读权限,属于粗粒度授权。具体授权操作,请参见为RAM角色授权

权限策略名称

说明

AliyunMSEFullAccess

管理微服务引擎MSE的权限,等同于阿里云账号的权限,被授予该权限的RAM用户拥有所有功能的操作权限。

AliyunMSEReadOnlyAccess

微服务引擎MSE的只读权限,被授予该权限的RAM用户具有阿里云账号所有资源的只读权限。

说明

步骤三:获取STS Token

需要获取步骤一所对应的RAM角色的临时访问凭据STS Token,关于如何获取STS Token,请参见AssumeRole - 获取扮演角色的临时身份凭证

步骤四:客户端(SDK)配置鉴权

临时凭据包括Access Key ID、Access Key Secret和Security Token,需一起使用。

Java版本的Nacos Client

若您使用的是Java版本的Nacos Client,请按照下列方式引入依赖及配置程序代码。

说明

Nacos-Client的版本需要2.1.0及以上版本。更多信息,请参见Nacos Client鉴权及加解密支持版本

<!-- https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client-mse-extension -->
<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-client-mse-extension</artifactId>
    <!-- 需要1.0.5及以上版本 -->
    <version>1.0.5</version>
</dependency>
properties.put(PropertyKeyConst.SERVER_ADDR, "${mseNacos实例域名}");
# 可通过配置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID替代
properties.put(ExtensionAuthPropertyKey.ACCESS_KEY_ID.getKey(), "${临时凭据的AccessKeyID}");
# 可通过配置环境变量ALIBABA_CLOUD_ACCESS_KEY_SECRET替代
properties.put(ExtensionAuthPropertyKey.ACCESS_KEY_SECRET.getKey(), "${临时凭据的AccessKeySecret}");
# 可通过配置环境变量ALIBABA_CLOUD_SECURITY_TOKEN替代
properties.put(ExtensionAuthPropertyKey.SECURITY_TOKEN_KEY.getKey(), "${临时凭据的SecurityToken}");
NamingService naming = NamingFactory.createNamingService(properties);
ConfigService configService = ConfigFactory.createConfigService(properties);
Spring Cloud Alibaba框架

若您使用的是Spring Cloud Alibaba框架,请按照下列方式引入依赖并在应用配置文件添加下列配置。

说明
<!-- https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client-mse-extension -->
<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-client-mse-extension</artifactId>
    <!-- 需要1.0.5及以上版本 -->
    <version>1.0.5</version>
</dependency>
## 注册中心
# 可通过配置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID替代
spring.cloud.nacos.discovery.alibabaCloudAccessKeyId=${临时凭据的AccessKeyID}
# 可通过配置环境变量ALIBABA_CLOUD_ACCESS_KEY_SECRET替代
spring.cloud.nacos.discovery.alibabaCloudAccessKeySecret=${临时凭据的AccessKeySecret}
# 可通过配置环境变量ALIBABA_CLOUD_SECURITY_TOKEN替代
spring.cloud.nacos.discovery.alibabaCloudSecurityToken=${临时凭据的SecurityToken}

## 配置中心
# 可通过配置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID替代
spring.cloud.nacos.config.alibabaCloudAccessKeyId=${临时凭据的AccessKeyID}
# 可通过配置环境变量ALIBABA_CLOUD_ACCESS_KEY_SECRET替代
spring.cloud.nacos.config.alibabaCloudAccessKeySecret=${临时凭据的AccessKeySecret}
# 可通过配置环境变量ALIBABA_CLOUD_SECURITY_TOKEN替代
spring.cloud.nacos.config.alibabaCloudSecurityToken=${临时凭据的SecurityToken}
Dubbo框架

若您使用的是Dubbo框架,请按照下列方式引入依赖并在dubbo配置文件的注册中心链接URL中加入下列配置。

说明

Nacos-Client的版本需要2.1.0及以上版本。更多信息,请参见Nacos Client鉴权及加解密支持版本

<!-- https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client-mse-extension -->
<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-client-mse-extension</artifactId>
    <!-- 需要1.0.5及以上版本 -->
    <version>1.0.5</version>
</dependency>
# 可通过配置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID,ALIBABA_CLOUD_ACCESS_KEY_SECRET,ALIBABA_CLOUD_SECURITY_TOKEN替代
dubbo.registry.address=nacos://${mseNacos实例域名}:8848?alibabaCloudAccessKeyId=${临时凭据的AccessKeyID}&alibabaCloudAccessKeySecret=${临时凭据的AccessKeySecret}&alibabaCloudSecurityToken=${临时凭据的SecurityToken}

方式四:使用RAMRoleARN

如果您的应用程序需要授权访问MSE Nacos,例如跨阿里云账号访问MSE Nacos,您可以使用RAMRoleARN初始化凭证提供者。该方式底层实现是STS Token。通过指定RAM角色的ARN(Alibabacloud Resource Name),Nacos Client会前往STS服务获取STS Token,并在会话到期前自动刷新STS Token。此外,您还可以通过为policy赋值来限制RAM角色到一个更小的权限集合。

重要

该方式需要您提供一个AccessKey,且此AccessKey具有扮演角色的权限。建议限制此AccessKey仅有扮演角色的权限,且限制此AccessKey可扮演的角色,具体内容请参见AssumeRole - 获取扮演角色的临时身份凭证

步骤一:创建RAM用户和RAM角色(可选)

步骤二:为RAM用户及RAM角色添加权限

  • 为步骤一所涉及的RAM用户授权STS的管理权限,具体请参见AssumeRole - 获取扮演角色的临时身份凭证

  • 为步骤一所涉及的RAM角色授权,并选择以下系统策略。此操作将为RAM角色授予对所有Nacos实例配置和服务的读写或只读权限,属于粗粒度授权。具体授权操作,请参见为RAM角色授权

权限策略名称

说明

AliyunMSEFullAccess

管理微服务引擎MSE的权限,等同于阿里云账号的权限,被授予该权限的RAM用户拥有所有功能的操作权限。

AliyunMSEReadOnlyAccess

微服务引擎MSE的只读权限,被授予该权限的RAM用户具有阿里云账号所有资源的只读权限。

说明

步骤三:客户端(SDK)配置鉴权

此方式需要您配置AccessKey及对应角色的RAMRoleArn作为凭据。

Java版本的Nacos Client

若您使用的是Java版本的Nacos Client,请按照下列方式引入依赖及配置程序代码。

说明

Nacos-Client的版本需要2.1.0及以上版本。更多信息,请参见Nacos Client鉴权及加解密支持版本

<!-- https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client-mse-extension -->
<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-client-mse-extension</artifactId>
    <!-- 需要1.0.5及以上版本 -->
    <version>1.0.5</version>
</dependency>
properties.put(PropertyKeyConst.SERVER_ADDR, "${mseNacos实例域名}");
# 可通过配置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID替代
properties.put(ExtensionAuthPropertyKey.ACCESS_KEY_ID.getKey(), "${具有扮演角色权限的AccessKeyID}");
# 可通过配置环境变量ALIBABA_CLOUD_ACCESS_KEY_SECRET替代
properties.put(ExtensionAuthPropertyKey.ACCESS_KEY_SECRET.getKey(), "${具有扮演角色权限的AccessKeySecret}");
# 可通过配置环境变量ALIBABA_CLOUD_ROLE_ARN替代
properties.put(ExtensionAuthPropertyKey.ROLE_ARN.getKey(), "${被扮演的角色的RoleArn}");
# 可通过配置环境变量ALIBABA_CLOUD_ROLE_SESSION_NAME替代
properties.put(ExtensionAuthPropertyKey.ROLE_SESSION_NAME.getKey(), "${角色扮演会话名称,自定义}");
## 以下为可选参数
# 可通过配置环境变量ALIBABA_CLOUD_POLICY替代
properties.put(ExtensionAuthPropertyKey.POLICY.getKey(), "${设置更小的权限策略}");
# 可通过配置环境变量ALIBABA_CLOUD_ROLE_SESSION_EXPIRATION替代
properties.put(ExtensionAuthPropertyKey.ROLE_SESSION_EXPIRATION.getKey(), "${角色扮演的有效期,单位秒}");
NamingService naming = NamingFactory.createNamingService(properties);
ConfigService configService = ConfigFactory.createConfigService(properties);
Spring Cloud Alibaba框架

若您使用的是Spring Cloud Alibaba框架,请按照下列方式引入依赖并在应用配置文件添加下列配置。

说明
<!-- https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client-mse-extension -->
<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-client-mse-extension</artifactId>
    <!-- 需要1.0.5及以上版本 -->
    <version>1.0.5</version>
</dependency>
## 注册中心
# 可通过配置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID替代
spring.cloud.nacos.discovery.alibabaCloudAccessKeyId=${具有扮演角色权限的AccessKeyID}
# 可通过配置环境变量ALIBABA_CLOUD_ACCESS_KEY_SECRET替代
spring.cloud.nacos.discovery.alibabaCloudAccessKeySecret=${具有扮演角色权限的AccessKeySecret}
# 可通过配置环境变量ALIBABA_CLOUD_ROLE_ARN替代
spring.cloud.nacos.discovery.alibabaCloudRoleArn=${被扮演的角色的RoleArn}
# 可通过配置环境变量ALIBABA_CLOUD_ROLE_SESSION_NAME替代
spring.cloud.nacos.discovery.alibabaCloudRoleSessionName=${角色扮演会话名称,自定义}

## 配置中心
# 可通过配置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID替代
spring.cloud.nacos.config.alibabaCloudAccessKeyId=${具有扮演角色权限的AccessKeyID}
# 可通过配置环境变量ALIBABA_CLOUD_ACCESS_KEY_SECRET替代
spring.cloud.nacos.config.alibabaCloudAccessKeySecret=${具有扮演角色权限的AccessKeySecret}
# 可通过配置环境变量ALIBABA_CLOUD_ROLE_ARN替代
spring.cloud.nacos.config.alibabaCloudRoleArn=${被扮演的角色的RoleArn}
# 可通过配置环境变量ALIBABA_CLOUD_ROLE_SESSION_NAME替代
spring.cloud.nacos.config.alibabaCloudRoleSessionName=${角色扮演会话名称,自定义}

## 以下为可选参数
# 可通过配置环境变量ALIBABA_CLOUD_POLICY替代
spring.cloud.nacos.discovery.alibabaCloudPolicy=${设置更小的权限策略}
spring.cloud.nacos.config.alibabaCloudPolicy=${设置更小的权限策略}
# 可通过配置环境变量ALIBABA_CLOUD_ROLE_SESSION_EXPIRATION替代
spring.cloud.nacos.discovery.alibabaCloudRoleSessionExpiration=${角色扮演的有效期,单位秒}
spring.cloud.nacos.config.alibabaCloudRoleSessionExpiration=${角色扮演的有效期,单位秒}
Dubbo框架

若您使用的是Dubbo框架,请按照下列方式引入依赖并在dubbo配置文件的注册中心链接URL中加入下列配置。

说明

Nacos-Client的版本需要2.1.0及以上版本。更多信息,请参见Nacos Client鉴权及加解密支持版本

<!-- https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client-mse-extension -->
<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-client-mse-extension</artifactId>
    <!-- 需要1.0.5及以上版本 -->
    <version>1.0.5</version>
</dependency>
# 可通过配置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID,ALIBABA_CLOUD_ACCESS_KEY_SECRET,ALIBABA_CLOUD_ROLE_ARN,ALIBABA_CLOUD_ROLE_SESSION_NAME替代
dubbo.registry.address=nacos://${mseNacos实例域名}:8848?alibabaCloudAccessKeyId=${具有扮演角色权限的AccessKeyID}&alibabaCloudAccessKeySecret=${具有扮演角色权限的AccessKeySecret}&alibabaCloudRoleArn=${被扮演的角色的RoleArn}&alibabaCloudRoleSessionName=${角色扮演会话名称,自定义}

## 以下为可选参数,补充在URL之后;可通过配置环境变量ALIBABA_CLOUD_POLICY,ALIBABA_CLOUD_ROLE_SESSION_EXPIRATION替代
&alibabaCloudPolicy=${设置更小的权限策略}&alibabaCloudRoleSessionExpiration=${角色扮演的有效期,单位秒}

方式五:使用ECSRAMRole

借助ECS实例或ACK实例的RAM角色,您可以将RAM角色与ECS实例或ACK实例关联起来,然后将RAM角色名称告知Nacos Client,无需配置AccessKey即可访问MSE。基于RAM角色,您可以为不同实例设定不同的角色和授权策略,控制访问权限粒度或范围。请参见ECS实例RAM角色授权概述RAM角色概览

说明

使用ECSRAMRole方式进行鉴权,需要将应用部署到阿里云ECS实例或ACK集群,且ECS实例或ACK集群的网络环境为专用网络VPC。更多信息,请参见什么是云服务器ECS什么是容器服务 Kubernetes 版什么是专有网络

步骤一:创建RAM角色并配置授权策略

为ECS实例授予可访问MSE Nacos的角色
  1. 可选:创建可信实体为阿里云服务的RAM角色。具体操作,请参见创建可信实体为阿里云服务的RAM角色

  2. 为已有或者创建的RAM角色授权,并选择以下系统策略。此操作将为RAM角色授予对所有Nacos实例配置和服务的读写或只读权限,属于粗粒度授权。具体授权操作,请参见为RAM角色授权

    权限策略名称

    说明

    AliyunMSEFullAccess

    管理微服务引擎MSE的权限,等同于阿里云账号的权限,被授予该权限的RAM用户拥有所有功能的操作权限。

    AliyunMSEReadOnlyAccess

    微服务引擎MSE的只读权限,被授予该权限的RAM用户具有阿里云账号所有资源的只读权限。

    说明
  3. 登录ECS管理控制台,在左侧导航栏,选择实例与镜像 > 实例

  4. 在页面左侧顶部,选择目标资源所在的资源组和地域。

    image

  5. 找到要操作的ECS实例,选择image.png > 实例设置 > 授予/收回RAM角色

  6. 在对话框中,选择创建好的实例RAM角色,单击确定

为ACK集群Worker RAM角色授予权限
说明

ACK集群在创建时会自动创建Worker RAM角色,因此无需再次创建角色,直接使用此角色进行授权。

  1. 创建自定义权限策略,具体操作,请参见创建自定义权限策略

    • 为实例授予微服务引擎MSE的管理权限。

      {
          "Action": "mse:*",
          "Resource": "*",
          "Effect": "Allow"
      },
      {
          "Action": "ram:CreateServiceLinkedRole",
          "Resource": "*",
          "Effect": "Allow",
          "Condition": {
              "StringEquals": {
                  "ram:ServiceName": "mse.aliyuncs.com"
              }
          }
      }
    • 为实例授予微服务引擎MSE的只读权限。

      {
          "Action": [
              "mse:Query*",
              "mse:List*",
              "mse:Get*"
          ],
          "Resource": "*",
          "Effect": "Allow"
      },
      {
          "Action": "ram:CreateServiceLinkedRole",
          "Resource": "*",
          "Effect": "Allow",
          "Condition": {
              "StringEquals": {
                  "ram:ServiceName": "mse.aliyuncs.com"
              }
          }
      }
    说明

    如果需要授予实例细粒度的MSE访问权限,您需要自定义权限策略。更多信息,请参见注册中心细粒度鉴权配置中心细粒度鉴权配置注册中心常用自定义授权样例

  2. 为集群的Worker RAM角色授权。具体操作,请参见为集群的Worker RAM角色授权

步骤二:客户端(SDK)配置鉴权

Java版本的Nacos Client

若您使用的是Java版本的Nacos Client,请按照下列方式配置程序代码。

说明

使用RAM角色进行鉴权需要客户端升级至对应版本。更多信息,请参见Nacos Client鉴权及加解密支持版本

properties.put(PropertyKeyConst.SERVER_ADDR, "${mseNacos实例域名}");
properties.put(PropertyKeyConst.RAM_ROLE_NAME, "${roleName}");
// 注册中心
NamingService naming = NamingFactory.createNamingService(properties);
// 配置中心
ConfigService configService = ConfigFactory.createConfigService(properties);
Spring Cloud Alibaba框架

若您使用的是Spring Cloud Alibaba框架,请在应用配置文件中添加下列配置。

说明

需要将Spring Cloud Alibaba框架版本升级至2.2.9.RELEASE及以上版本。

## 注册中心
spring.cloud.nacos.discovery.ramRoleName=${roleName}

## 配置中心
spring.cloud.nacos.config.ramRoleName=${roleName}
Dubbo框架

若您使用的是Dubbo框架,请在dubbo配置文件的注册中心链接URL中加入下列配置。

dubbo.registry.address=nacos://${mseNacos实例域名}:8848?ramRoleName=${roleName}

方式六:使用OIDCRoleARN

在容器服务Kubernetes版中设置了Worker节点RAM角色(方式五)后,对应节点内的Pod中的应用也就可以像ECS上部署的应用一样,通过元数据服务(Meta Data Server)获取关联角色的STS Token。但如果容器集群上部署的是不可信的应用(比如部署您的客户提交的应用,代码也没有对您开放),您可能并不希望它们能通过元数据服务获取Worker节点关联实例RAM角色的STS Token。

为了避免影响云上资源的安全,同时又能让这些不可信的应用安全地获取所需的STS Token,实现应用级别的权限最小化,您可以使用RRSA(RAM Roles for Service Account)功能。该方式底层实现是STS Token。阿里云容器集群会为不同的应用Pod创建和挂载相应的服务账户OIDC Token文件,并将相关配置信息注入到环境变量中,Nacos Client会通过获取环境变量的配置信息,调用STS服务的AssumeRoleWithOIDC接口换取绑定角色的STS Token。该方式无需您提供一个AK或STS Token,消除了手动维护AK或STS Token的风险。

步骤一:开启ACK集群的RRSA功能

开启ACK集群的RRSA功能,请参见通过RRSA配置ServiceAccount的RAM权限实现Pod权限隔离

步骤二:为RAM角色授权

为步骤一所涉及的RAM角色(如通过RRSA配置ServiceAccount的RAM权限实现Pod权限隔离中的demo-role-for-rrsa)授予MSE Nacos的访问权限,并选择以下系统策略。此操作将为RAM角色授予对所有Nacos实例配置和服务的读写或只读权限,属于粗粒度授权。具体授权操作,请为RAM角色授权

权限策略名称

说明

AliyunMSEFullAccess

管理微服务引擎MSE的权限,等同于阿里云账号的权限,被授予该权限的RAM用户拥有所有功能的操作权限。

AliyunMSEReadOnlyAccess

微服务引擎MSE的只读权限,被授予该权限的RAM用户具有阿里云账号所有资源的只读权限。

说明

步骤三:客户端(SDK)配置鉴权

此方式您只需要配置RoleSessionName,其他临时凭据将根据ACK的RRSA功能所传入的环境变量提供。

Java版本的Nacos Client

若您使用的是Java版本的Nacos Client,请按照下列方式配置程序代码。

说明

Nacos-Client的版本需要2.1.0及以上版本。更多信息,请参见Nacos Client鉴权及加解密支持版本

<!-- https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client-mse-extension -->
<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-client-mse-extension</artifactId>
    <!-- 需要1.0.5及以上版本 -->
    <version>1.0.5</version>
</dependency>
properties.put(PropertyKeyConst.SERVER_ADDR, "${mseNacos实例域名}");
# 可通过配置环境变量ALIBABA_CLOUD_ROLE_SESSION_NAME替代
properties.put(ExtensionAuthPropertyKey.ROLE_SESSION_NAME.getKey(), "${角色扮演会话名称,自定义}");
## 以下为可选参数
# 可通过配置环境变量ALIBABA_CLOUD_POLICY替代
properties.put(ExtensionAuthPropertyKey.POLICY.getKey(), "${设置更小的权限策略}");
# 可通过配置环境变量ALIBABA_CLOUD_ROLE_SESSION_EXPIRATION替代
properties.put(ExtensionAuthPropertyKey.ROLE_SESSION_EXPIRATION.getKey(), "${角色扮演的有效期,单位秒}");
NamingService naming = NamingFactory.createNamingService(properties);
ConfigService configService = ConfigFactory.createConfigService(properties);
Spring Cloud Alibaba框架

若您使用的是Spring Cloud Alibaba框架,请按照下列方式引入依赖并在应用配置文件添加下列配置。

说明
<!-- https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client-mse-extension -->
<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-client-mse-extension</artifactId>
    <!-- 需要1.0.5及以上版本 -->
    <version>1.0.5</version>
</dependency>
## 注册中心
# 可通过配置环境变量ALIBABA_CLOUD_ROLE_SESSION_NAME替代
spring.cloud.nacos.discovery.alibabaCloudRoleSessionName=${角色扮演会话名称,自定义}

## 配置中心
# 可通过配置环境变量ALIBABA_CLOUD_ROLE_SESSION_NAME替代
spring.cloud.nacos.config.alibabaCloudRoleSessionName=${角色扮演会话名称,自定义}

## 以下为可选参数
# 可通过配置环境变量ALIBABA_CLOUD_POLICY替代
spring.cloud.nacos.discovery.alibabaCloudPolicy=${设置更小的权限策略}
spring.cloud.nacos.config.alibabaCloudPolicy=${设置更小的权限策略}
# 可通过配置环境变量ALIBABA_CLOUD_ROLE_SESSION_EXPIRATION替代
spring.cloud.nacos.discovery.alibabaCloudRoleSessionExpiration=${角色扮演的有效期,单位秒}
spring.cloud.nacos.config.alibabaCloudRoleSessionExpiration=${角色扮演的有效期,单位秒}
Dubbo框架

若您使用的是Dubbo框架,请按照下列方式引入依赖并在dubbo配置文件的注册中心链接URL中加入下列配置。

说明

Nacos-Client的版本需要2.1.0及以上版本。更多信息,请参见Nacos Client鉴权及加解密支持版本

<!-- https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client-mse-extension -->
<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-client-mse-extension</artifactId>
    <!-- 需要1.0.5及以上版本 -->
    <version>1.0.5</version>
</dependency>
# 可通过配置环境变量ALIBABA_CLOUD_ROLE_SESSION_NAME替代
dubbo.registry.address=nacos://${mseNacos实例域名}:8848?alibabaCloudRoleSessionName=${角色扮演会话名称,自定义}

## 以下为可选参数,补充在URL之后;可通过配置环境变量ALIBABA_CLOUD_POLICY,ALIBABA_CLOUD_ROLE_SESSION_EXPIRATION替代
&alibabaCloudPolicy=${设置更小的权限策略}&alibabaCloudRoleSessionExpiration=${角色扮演的有效期,单位秒}

方式七:使用CredentialsURI

如果您的应用程序需要通过外部系统获取阿里云凭证,从而实现灵活的凭证管理和无密钥访问,您可以使用CredentialsURI初始化凭证提供者。该方式底层实现是STS Token。Nacos Client通过您提供的URI获取STS Token,完成凭证客户端初始化。该方式无需您提供一个AccessKey或STS Token,消除了手动维护AccessKey或STS Token的风险。

重要

提供CredentialsURI响应的后端服务需要实现STS Token的自动刷新逻辑,确保您的应用程序始终能获取到有效凭证。

步骤一:确认CredentialsURI服务的响应正确

为了使Nacos Client正确解析和使用STS Token,CredentialsURI必须遵循以下响应协议:

  • 响应状态码:200

  • 响应体结构:

    {
        "Code": "Success",
        "AccessKeySecret": "AccessKeySecret",
        "AccessKeyId": "AccessKeyId",
        "Expiration": "2021-09-26T03:46:38Z",
        "SecurityToken": "SecurityToken"
    }

步骤二:为RAM角色授权

为步骤一所涉及的RAM角色授予MSE Nacos的访问权限,并选择以下系统策略。此操作将为RAM角色授予对所有Nacos实例配置和服务的读写或只读权限,属于粗粒度授权。具体授权操作,请参见为RAM角色授权

权限策略名称

说明

AliyunMSEFullAccess

管理微服务引擎MSE的权限,等同于阿里云账号的权限,被授予该权限的RAM用户拥有所有功能的操作权限。

AliyunMSEReadOnlyAccess

微服务引擎MSE的只读权限,被授予该权限的RAM用户具有阿里云账号所有资源的只读权限。

说明

步骤三:客户端(SDK)配置鉴权

Java版本的Nacos Client

若您使用的是Java版本的Nacos Client,请按照下列方式引入依赖及配置程序代码。

说明

Nacos-Client的版本需要2.1.0及以上版本。更多信息,请参见Nacos Client鉴权及加解密支持版本

<!-- https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client-mse-extension -->
<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-client-mse-extension</artifactId>
    <!-- 需要1.0.5及以上版本 -->
    <version>1.0.5</version>
</dependency>
properties.put(PropertyKeyConst.SERVER_ADDR, "${mseNacos实例域名}");
# 可通过配置环境变量ALIBABA_CLOUD_CREDENTIALS_URI替代
properties.put(ExtensionAuthPropertyKey.CREDENTIALS_URI.getKey(), "${Credentials服务的URI,例如:https://$host:$port/$path....");
NamingService naming = NamingFactory.createNamingService(properties);
ConfigService configService = ConfigFactory.createConfigService(properties);
Spring Cloud Alibaba框架

若您使用的是Spring Cloud Alibaba框架,请按照下列方式引入依赖并在应用配置文件添加下列配置。

说明
<!-- https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client-mse-extension -->
<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-client-mse-extension</artifactId>
    <!-- 需要1.0.5及以上版本 -->
    <version>1.0.5</version>
</dependency>
## 注册中心
# 可通过配置环境变量ALIBABA_CLOUD_CREDENTIALS_URI替代
spring.cloud.nacos.discovery.alibabaCloudCredentialsUri=${Credentials服务的URI,例如:https://$host:$port/$path....}

## 配置中心
# 可通过配置环境变量ALIBABA_CLOUD_CREDENTIALS_URI替代
spring.cloud.nacos.config.alibabaCloudCredentialsUri=${Credentials服务的URI,例如:https://$host:$port/$path....}
Dubbo框架

若您使用的是Dubbo框架,请按照下列方式引入依赖并在dubbo配置文件的注册中心链接URL中加入下列配置。

说明

Nacos-Client的版本需要2.1.0及以上版本。更多信息,请参见Nacos Client鉴权及加解密支持版本

<!-- https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client-mse-extension -->
<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-client-mse-extension</artifactId>
    <!-- 需要1.0.5及以上版本 -->
    <version>1.0.5</version>
</dependency>
# 可通过配置环境变量ALIBABA_CLOUD_CREDENTIALS_URI替代
dubbo.registry.address=nacos://${mseNacos实例域名}:8848?alibabaCloudCredentialsUri=${Credentials服务的URI,例如:https://$host:$port/$path....}

相关文档